﻿/*
 ***************************************************************************
 * Microsoft Visual C# .NET
 * 名称：       Shpm.App.Commons.Utils.ControllerUtils
 * 类型：       
 * 功能说明：   控制层跳转（权限校验）
 * 作者：       王伟栋
 * 创建日期：   2007/09/13
 * 修改日期     修改者      修改内容
 * 
 * 
 * ---
 ***************************************************************************
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI;
using System.Web;
using Shpm.App.Commons.Db.Beans.Master;
using Shpm.System.Auth.Dao;
using Shpm.System;
using System.IO;

namespace Shpm.App.Commons.Utils
{
    public class ControllerUtils
    {
        /*名称： Transfer
         *功能： 跳转页面。
         *参数： Context        HTTP请求上下文
         *       path           请求的文件路径
         *       preserveForm   是否保持页面
         *返回： 无
         *说明： 
        */
        public static void Transfer(HttpContext context, string path, bool preserveForm) 
        {
            string className = context.Server.MapPath(path).Substring(context.Request.PhysicalApplicationPath.Length).Replace("\\", "/");

            if (ControllerUtils.checkAuthority(context, className))
            {
                context.Server.Transfer(path, preserveForm);
            }
            else
            {
                context.Server.Transfer(Constants.UNAUTH_PAGE);
            }
        }

        /*名称： Transfer
         *功能： 跳转页面。
         *参数： Context    HTTP请求上下文
         *       path       请求的文件路径
         *返回： 无
         *说明： 
        */
        public static void Transfer(HttpContext context, string path)
        {
            string className = context.Server.MapPath(path).Substring(context.Request.PhysicalApplicationPath.Length).Replace("\\", "/");

            if (ControllerUtils.checkAuthority(context, className))
            {
                context.Server.Transfer(path);
            }
            else
            {
                context.Server.Transfer(Constants.UNAUTH_PAGE);
            }
        }

        /*名称： checkAuthority
         *功能： 校验是否具备权限。
         *参数： Context    HTTP请求上下文
         *       className  请求的文件名
         *返回： 校验成功,True 
         *       校验失败,False
         *说明： 
        */
        public static bool checkAuthority(HttpContext Context, string className)
        {
            if (isNeedAuthority(className)==false)
            {
                // 不需要权限校验的情况直接返回
                return true;
            }

            if (string.IsNullOrEmpty(className)==false)
            {
                MstClassNameBean dataMstClassNameBean = new MstClassNameBean();
                LogonDao Dao = new LogonDao();
                dataMstClassNameBean.ClassName = className;
                dataMstClassNameBean = Dao.LoadMstClassNameRfc(dataMstClassNameBean);
                if (dataMstClassNameBean != null)
                {
                    if (dataMstClassNameBean.Reference != null)
                    {
                        do
                        {
                            dataMstClassNameBean.ClassName = dataMstClassNameBean.Reference;
                            dataMstClassNameBean = Dao.LoadMstClassNameRfc(dataMstClassNameBean);
                        }
                        while (dataMstClassNameBean.Reference != null && dataMstClassNameBean.Reference != string.Empty);
                    }
                    className = dataMstClassNameBean.ClassName;
                }

                SysUserBean ctx = null;
                AuthorityData authData = new AuthorityData();
                authData.ClassName = className;
                authData = Dao.LoadClassName(authData);
                if (Context.Session != null && Context.Session[Constants.USER_CONTEXT_KEY] != null)
                {
                    ctx = (SysUserBean)Context.Session[Constants.USER_CONTEXT_KEY];
                }

                AppAuthorityChecker authCheck = new AppAuthorityChecker();
                return authCheck.IsAuthority(ctx, authData);
            }

            return false;
        }

        /*名称： isNeedAuthority
         *功能： 判断该文件名的后缀是否需要权限校验。
         *参数： className  请求的文件名
         *返回： 需要校验,True 
         *       不要校验,False
         *说明： 
        */
        protected static bool isNeedAuthority(string className)
        {
            string str = className.ToLower();

            string[] strAddress = Constants.CHECK_PERMISSION_EXTENSION.Split(';');
            for (int i = 0; i < strAddress.Length; i++)
            {
                if (str.EndsWith((strAddress[i].Trim()).ToLower())) return true;
            }

            return false;
        }
    }
}
